package xyz.cerberu.cet.global.controller;


import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import xyz.cerberu.cet.global.domain.ExceptionEncode;
import xyz.cerberu.cet.global.domain.Result;
import xyz.cerberu.cet.global.service.CommonService;
import xyz.cerberu.cet.global.utils.ResultUtils;
import xyz.cerberu.cet.user.domain.User;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author β世界
 * Created on 17:42
 * @Description 全局Control
 */
@Controller
public class GlobalControl {

    private final CommonService commonService;

    @Autowired
    public GlobalControl(CommonService commonService) {
        this.commonService = commonService;
    }

    /**
     * @author β世界 on 17:43 2020/7/2
     * 根据用户登陆状态，来返回不同的nav标签内容
     * 1.未登录的用户:登陆和注册(不允许使用订阅、发布)
     * 2.正常用户/被ban用户:订阅
     * 3.发布者:订阅、发布
     **/
    @ResponseBody
    @RequestMapping(value = "/nav",method = RequestMethod.GET)
    public Result<Object> nav(){

        Map<String,Object> nav = new HashMap<>();
        Result<Object> result = null;

        // 获取用户的信息
        Subject subject = SecurityUtils.getSubject();
        // 用户已经登陆
        if(subject.isAuthenticated() || subject.isRemembered()){
            User user = (User) subject.getPrincipal();
            int level = user.getRole().getRid();
            // 添加用户的组件信息
            addNav(level,nav);
            // 添加用户名、还有邮箱头像
            nav.put("user",user.getUsername());
            nav.put("picture",user.getPicture());
            nav.put("logout","<li><a href='/CeT/user/lougot'>登出</a></li>");
            // 设置相应成功
            result = ResultUtils.genSuccessResult(nav);
        }else {
            // 没有登陆,就仅仅提供登陆和注册的窗口即可
            nav.put("status","<li><a href=\"/user/login\">登录/注册</a></li>");
            // 设置状态码为未登录
            result = ResultUtils.genErrorResult(ExceptionEncode.USER_STATUS_EXCEPTION,"",nav);
        }

        // 添加年份记录
        nav.put("years",commonService.getFormerYears());

        return result;
    }

    /**
     * @author β世界 on 19:53 2020/8/13
     * 获取年份
     **/
    @ResponseBody
    @RequestMapping(value = "/years")
    public String[] years(){
        return commonService.getFormerYears();
    }

    /**
     * @author β世界 on 21:56 2020/7/2
     * 根据用户等级来添加操作空间
     * (需要替换成相关的tag，来防止出现xss问题，因为是直接渲染的HTML标签，如果修改了返回值，那么就很容易出现XSS攻击)
     * @param role: 用户的等级
     * @return java.util.Map<java.lang.String, java.lang.Object>
     **/
    private void addNav(int role,Map<String,Object> nav){
        List<String> group = new ArrayList<>();
        // 正常和被ban用户
        if (role == -1 || role >= 1){
            // 添加订阅功能
            group.add("<li><a href=\"/subscription\">订阅</a></li>");
        }
        // 上传者权限
        if(role >= 2){
            group.add("<li><a href=\"#\">发布</a></li>");
        }
        // 管理者权限
        if(role >= 3){
            List<String> manager = new ArrayList<>();
            manager.add("<li><a href=\"/manager/spidermanager\">爬虫管理</a></li>");
            manager.add("<li><a href=\"/manager/animemanager\">动漫管理</a></li>");
            manager.add("<li><a href=\"/manager/resourcemanager\">资源管理</a></li>");
            nav.put("manager",manager);
        }
        nav.put("group",group);
    }

    /**
     * @author β世界 on 21:37 2020/8/13
     * 获取所有的年份
     **/
    @ResponseBody
    @RequestMapping("/formerYears")
    public Result<String[]> formerYears(){
        return ResultUtils.genSuccessResult(commonService.getFormerYears());
    }

}
